/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ccs.dao;

import ccs.bean.Bean;
import ccs.util.HibernateUtil;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;
/**
 * Super clase que sirve para hacer las operaciones basicas de cualquier Bean
 * usando Hibernate
 *
 * @author José Irineo Coria Hernánez
 */
public class DataAccessObject {

    private Session s;

    /**
     * Metodo que hace un insert o un update.
     *
     * @param b el Bean que va a ser guardado o actualizado
     * @return <ul><li><code>true</code> si la operación es
     * exitosa.</li><li><code>false</code> si la operación falló.</li></ul>
     */
    public boolean guardarOActualizar(Bean b) {
        boolean resultado = false;
        s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().openSession();
            t = s.beginTransaction();
            s.saveOrUpdate(b);
            t.commit();
            resultado = true;
        } catch (Exception e) {
            System.out.println("Error [DataAccessObject - guardarOActualizar (" + b.getClass() + ")]\n\t" + e.getMessage());
            if (t != null) {
                t.rollback();
            }
        } finally {
            if (s != null) {
                s.close();
            }
        }
        return resultado;
    }

    /**
     * Método para hacer un delete.
     *
     * @param b el Bean que va a ser eliminado.
     * @return <ul><li><code>true</code> si la operación es
     * exitosa.</li><li><code>false</code> si la operación falló.</li></ul>
     */
    public boolean eliminar(Bean b) {
        boolean resultado = false;
        s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().openSession();
            t = s.beginTransaction();
            s.delete(b);
            t.commit();
            resultado = true;
        } catch (Exception e) {
            System.out.println("Error [DataAccessObject - eliminar (" + b.getClass() + ")]\n\t" + e.getMessage());
            if (t != null) {
                t.rollback();
            }
        } finally {
            if (s != null) {
                s.close();
            }
        }
        return resultado;
    }

    /**
     * Metodo que consulta todos los bean.
     *
     * @param b el tipo de bean que van a ser consultados.
     * @return una lista que contiene los bean obtenidos.
     */
    public List listado(Bean b) {
        List beans = new ArrayList();
        s = null;
        try {
            s = HibernateUtil.getSessionFactory().openSession();
            beans = s.createCriteria(b.getClass()).list();
        } catch (Exception e) {
            System.out.println("Error [DataAccessObject - listado (" + b.getClass() + ")]\n\t" + e.getMessage());
        }
        return beans;
    }

    /**
     * Metodo que consulta un bean.
     *
     * @param b el bean que contiene el ID para ser consultado.
     * @return el bean consultado.
     */
    public Bean consultar(Bean b) {
        s = null;
        try {
            s = HibernateUtil.getSessionFactory().openSession();
            b = (Bean) s.createCriteria(b.getClass()).add(Restrictions.eq("id", b.getId())).uniqueResult();
        } catch (Exception e) {
            System.out.println("Error [DataAccessObject - consultar (" + b.getClass() + ")]\n\t" + e.getMessage());
        }
        return b;
    }

    public void cerrarSesion() {
        if (s != null) {
            s.close();
        }
    }
}
